#include "widget.h"
#include <QVBoxLayout>
#include <QGraphicsGridLayout>
#include <QGraphicsLinearLayout>


// =========================== 折线图设置 ===========================
void Widget::chart_init(QWidget *parent)
{
    ensureSeriesAndAxes(parent);

    // ====== ChartView 铺满（只创建一次） ======
    QWidget* body = paneBody(parent);
    if (!body) return;
    auto v = qobject_cast<QVBoxLayout*>(body->layout());
    if (!v) return;

    if (!view) {
        view = new QChartView(chart, body);
        view->setRenderHint(QPainter::Antialiasing);
        view->setStyleSheet("background: transparent;");
        view->setBackgroundBrush(Qt::NoBrush);
        view->setFrameShape(QFrame::NoFrame);
        view->installEventFilter(this);
        v->addWidget(view, 1);   // 直接填满整个 body
    } else {
        view->setChart(chart);
    }

    // 我们自控绘图区，先别让 Qt 的自动外边距干扰
    chart->setMargins(QMargins(0, 0, 0, 0));
    chart->setAnimationOptions(QChart::NoAnimation);

    // 隐藏坐标轴数值（你之前的需求）
    if (axis_y) {
        axis_y->setLabelsVisible(false);
        axis_y->setTickCount(6);
    }
    if (axis_x) {
        axis_x->setLabelsVisible(false);
        axis_x->setTickCount(6);
    }

    // 定时器（只建一次）
    if (!timer) {
        timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &Widget::onTimer);
        xValue = 0;
        timer->start(INTERVAL);
    }
}

void Widget::ensureSeriesAndAxes(QWidget *parentForView)
{
    Q_UNUSED(parentForView);

    if (!chart) {
        chart = new QChart();
        chart->legend()->hide();
        chart->setTitle(QString());
        chart->setDropShadowEnabled(false);
        chart->setBackgroundVisible(false);
        chart->setBackgroundBrush(Qt::NoBrush);
        chart->setPlotAreaBackgroundVisible(false);
        chart->setMargins(QMargins(0, 0, 0, 0));
        chart->setBackgroundRoundness(0);
        if (chart->layout()) chart->layout()->setContentsMargins(0,0,0,0);
    }

    // 轴：只创建一次、复用
    if (!axis_x) axis_x = new QValueAxis();
    if (!axis_y) axis_y = new QValueAxis();

    // X 轴
    axis_x->setRange(0, RANGE);
    axis_x->setLabelsVisible(false);
    axis_x->setGridLineVisible(false);
    axis_x->setMinorGridLineVisible(false);

    if (!chart->axes(Qt::Horizontal).contains(axis_x))
        chart->addAxis(axis_x, Qt::AlignBottom);
    if (!chart->axes(Qt::Vertical).contains(axis_y))
        chart->addAxis(axis_y, Qt::AlignLeft);

    // === 关键修改：坐标轴线 = 不透明白色 ===
    QPen axisPen(Qt::white);   // 纯白，不透明
    axisPen.setWidth(2);       // 你可以调粗细
    axis_x->setLinePen(axisPen);
    axis_y->setLinePen(axisPen);

    // Y 轴网格线样式（依然半透明虚线）
    QPen gridPen;
    gridPen.setStyle(Qt::DashLine);
    gridPen.setColor(QColor(200, 200, 200, 120));  // 半透明灰
    axis_y->setGridLinePen(gridPen);

    // 四条曲线：只创建一次
    auto ensureSeries = [&](QLineSeries*& ref, const char* name) {
        if (!ref) {
            ref = new QLineSeries(chart);
            ref->setName(name);
            chart->addSeries(ref);
            ref->attachAxis(axis_x);
            ref->attachAxis(axis_y);
            ref->setVisible(false);
        } else if (!chart->series().contains(ref)) {
            chart->addSeries(ref);
            ref->attachAxis(axis_x);
            ref->attachAxis(axis_y);
            ref->setVisible(false);
        }
    };
    ensureSeries(seriesLight,    "light");
    ensureSeries(seriesSoilTemp, "soil_temp");
    ensureSeries(seriesSoilHum,  "soil_hum");
    ensureSeries(seriesCO2,      "co2");

    selectMetric(currentMetric);
}

void Widget::selectMetric(Metric m)
{
    currentMetric = m;

    // 全部隐藏
    if (seriesLight)    seriesLight->setVisible(false);
    if (seriesSoilTemp) seriesSoilTemp->setVisible(false);
    if (seriesSoilHum)  seriesSoilHum->setVisible(false);
    if (seriesCO2)      seriesCO2->setVisible(false);

    // 设置当前可见 & Y 轴范围（按你的要求）
    switch (m) {
    case Metric::SoilHum:    // 湿度
        if (seriesSoilHum) seriesSoilHum->setVisible(true);
        if (axis_y) axis_y->setRange(0, 100);
        break;
    case Metric::SoilTemp:   // 温度
        if (seriesSoilTemp) seriesSoilTemp->setVisible(true);
        if (axis_y) axis_y->setRange(0, 50);
        break;
    case Metric::Light:      // 光照
        if (seriesLight) seriesLight->setVisible(true);
        if (axis_y) axis_y->setRange(0, 2000);
        break;
    case Metric::CO2:        // CO2
        if (seriesCO2) seriesCO2->setVisible(true);
        if (axis_y) axis_y->setRange(0, 1000);
        break;
    }
}

void Widget::updateSensors(double lightLux, double soilTempC, double soilHumPct, double co2Ppm)
{
    QMutexLocker locker(&m_dataMutex);
    m_lightLux = lightLux;
    m_tempC    = soilTempC;
    m_humPct   = soilHumPct;
    m_co2Ppm   = co2Ppm;
}

// ========================== 统一数据产生点（四条曲线一起推进） ==========================
void Widget::onTimer()
{
    // 用当前 xValue 作为横坐标
    int x = xValue;

    // 按你给的数据范围随机
    int yHum   = QRandomGenerator::global()->bounded(50,  90);   // 湿度 50~89
    int yTemp  = QRandomGenerator::global()->bounded(20,  35);   // 温度 20~34
    int yLight = QRandomGenerator::global()->bounded(1000,2000); // 光照 1000~1999
    int yCO2   = QRandomGenerator::global()->bounded(300, 600);  // CO2 300~599

    if (seriesSoilHum)  seriesSoilHum->append(x, yHum);
    if (seriesSoilTemp) seriesSoilTemp->append(x, yTemp);
    if (seriesLight)    seriesLight->append(x, yLight);
    if (seriesCO2)      seriesCO2->append(x, yCO2);

    // X 轴滑动窗口
    if (axis_x) {
        if (x >= RANGE+1) axis_x->setRange(x - RANGE, x);
    }

    ++xValue;
}

void Widget::handlePaneClicked(const QString& title)
{
    if (!m_w3) return;

    // 面板的标题（w3 的渐变标题栏）仍然可以改：
    if (auto lbl = m_w3->findChild<QLabel*>("w3_title")) {
        lbl->setText(title);
    }

    // 惰性初始化图表/视图/定时器（只做一次；不会清空历史数据）
    chart_init(m_w3);

    // 按标题切换当前显示的曲线与对应 Y 轴范围
    if (title == QStringLiteral("光照强度")) {
        selectMetric(Metric::Light);
    } else if (title == QStringLiteral("土壤温度")) {
        selectMetric(Metric::SoilTemp);
    } else if (title == QStringLiteral("土壤湿度")) {
        selectMetric(Metric::SoilHum);
    } else if (title == QStringLiteral("二氧化碳")) {
        selectMetric(Metric::CO2);
    }

    // X 轴只显示最近 RANGE 个点
    if (axis_x) axis_x->setRange(std::max(0, xValue - RANGE), std::max(RANGE, xValue - RANGE));


}

// 固定绘图区：用固定留白把 plotArea 设到一个合适的矩形，保证四个指标等宽且不变小
void Widget::updatePlotArea()
{
    if (!chart) return;

    // 固定绘图区的留白（按需微调；left 决定 y 轴与图的统一留白）
    const int left = 1, top = 8, right = 12, bottom = 1;

    // 以 chart 自身区域为基准计算绘图区
    const QRectF full = chart->rect();
    QRectF pa(full.left() + left,
              full.top()  + top,
              full.width()  - left - right,
              full.height() - top  - bottom);

    // 避免极端情况下生成过小区域
    if (pa.width() < 10 || pa.height() < 10) return;

    // 只有在变化时才设置，避免不必要的重排
    if (chart->plotArea().toRect() != pa.toRect()) {
        chart->setPlotArea(pa);
    }
}

